﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using Gestión_UTN.util;

namespace Gestión_UTN.View.alta
{
    public partial class AltaInscripcionMateria : Form
    {
        private static Gestión_UTN.bl.carrerabl createCarrera = Gestión_UTN.factories.blfactory.createCarrera();
        private static Gestión_UTN.bl.alumnobl createAlumno = Gestión_UTN.factories.blfactory.createAlumno();
        private static Gestión_UTN.bl.inscripcionMateriabl createInsMateria = Gestión_UTN.factories.blfactory.createInsMateria();
        private static Gestión_UTN.bl.materiabl createMateria = Gestión_UTN.factories.blfactory.createMateria();
        private static Gestión_UTN.bl.regularidadbl createRegularidad = Gestión_UTN.factories.blfactory.createRegularidad();
        private static Gestión_UTN.bl.aprobadabl createAprobada = Gestión_UTN.factories.blfactory.createAprobada();

        private static int d = 0;
        private static string f = "";
        private static string c = "";
        private static string m = "";
        private static DataTable materias = null;

        public AltaInscripcionMateria()
        {
            InitializeComponent();
        }

        private void AltaInscripcionMateria_Load(object sender, EventArgs e)
        {
            DataTable carreras = createCarrera.FindAllCarreras();

            if (null != carreras)
            {
                foreach (DataRow dr in carreras.Rows)
                {
                    this.cmbCarrera.Items.Add(dr["car_nombre"]);
                }
            }

            DataTable inscripciones = createInsMateria.FindAllInscripcionesMaterias();

            if (null != inscripciones)
            {
                foreach (DataRow dr in inscripciones.Rows)
                {
                    this.dgvInscripciones.Rows.Add(dr["alu_dni"],
                        Convert.ToDateTime(dr["inm_fecha"]).ToShortDateString(),
                        dr["mat_nombre"], dr["car_nombre"]);
                }
            }

            this.txtFecha.Text = DateTime.Now.ToShortDateString();
        }

        private void btnNuevoAlumno_Click(object sender, EventArgs e)
        {
            AltaAlumno alta = new AltaAlumno();

            if (alta.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.txtDNI.Text = alta.DNI.ToString();
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            LimpiarForm();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Validar() && ValidarCorrelatividades())
                {
                    bo.Alumnobo alu = new bo.Alumnobo();

                    alu.Dni = Convert.ToInt32(this.txtDNI.Text);

                    bo.Materiabo mat = new bo.Materiabo();

                    mat.Id = Convert.ToInt32(materias.Select("mat_nombre = '" + this.cmbMateria.Text + "'" +
                        " AND car_nombre = '" + this.cmbCarrera.Text + "'")[0]["mat_id"]);

                    bo.InscripcionMateriabo inm = new bo.InscripcionMateriabo();

                    inm.Alumno = alu;
                    inm.Fecha = Convert.ToDateTime(this.txtFecha.Text);
                    inm.Materia = mat;

                    List<bo.InscripcionMateriabo> inscrip = createInsMateria.FindInscripcionMateriaByDNI(alu.Dni);

                    int ins_id = (inscrip.Find(ins => ins.Materia.Id == mat.Id) != null)
                        ? inscrip.Find(ins => ins.Materia.Id == mat.Id).Id : 0;

                    if (0 != ins_id)
                    {
                        MessageBox.Show("Inscripción ya Registrada!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                    else
                    {
                        bool ingresada = createInsMateria.SaveInscripcionMateria(inm);

                        if (ingresada)
                        {
                            MessageBox.Show("Inscripción Registrada!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            RefreshDgv();

                            LimpiarForm();
                        }
                        else
                        {
                            MessageBox.Show("Error al Registrar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }
                }
            }
            catch (exceptions.blexception)
            {
                MessageBox.Show("Error al Intentar Guardar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Guardar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Validar())
                {
                    bo.Alumnobo alu = new bo.Alumnobo();

                    alu.Dni = Convert.ToInt32(this.txtDNI.Text);

                    bo.Materiabo mat = new bo.Materiabo();

                    mat.Id = Convert.ToInt32(materias.Select("mat_nombre = '" + this.cmbMateria.Text + "'" +
                        " AND car_nombre = '" + this.cmbCarrera.Text + "'")[0]["mat_id"]);

                    bo.InscripcionMateriabo inm = new bo.InscripcionMateriabo();

                    inm.Alumno = alu;
                    inm.Fecha = Convert.ToDateTime(this.txtFecha.Text);
                    inm.Materia = mat;

                    int mat_id_anterior = Convert.ToInt32(materias.Select("mat_nombre = '" + m + "'" +
                        " AND car_nombre = '" + c + "'")[0]["mat_id"]);

                    bool modificada = createInsMateria.ModifyInscripcionMateria(Convert.ToDateTime(f), d, mat_id_anterior, inm);

                    if (modificada)
                    {
                        MessageBox.Show("Inscripción Modificada!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        RefreshDgv();

                        LimpiarForm();
                    }
                    else
                    {
                        MessageBox.Show("Error al Registrar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
            catch (exceptions.blexception)
            {
                MessageBox.Show("Error al Intentar Modificar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Modificar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }

        private void LimpiarForm()
        {
            this.txtDNI.Clear();
            this.cmbCarrera.Text = "";
            this.txtFecha.Text = DateTime.Now.ToShortDateString();
            this.cmbMateria.Text = "";
        }

        private bool Validar()
        {
            bool checkDNI = false;
            bool checkFecha = false;
            bool checkCarrera = false;
            bool checkMateria = false;

            if (!Validador.es_fecha(txtFecha))
            {
                errProv.SetError(txtFecha, "Formato: ##/##/####");
            }
            else
            {
                errProv.SetError(txtFecha, String.Empty);
                checkFecha = true;
            }

            if (this.cmbCarrera.Text.Equals(""))
            {
                errProv.SetError(cmbCarrera, "Ingrese una Carrera");
            }
            else
            {
                errProv.SetError(cmbCarrera, String.Empty);
                checkCarrera = true;
            }

            if (this.cmbMateria.Text.Equals(""))
            {
                errProv.SetError(cmbMateria, "Ingrese una Materia");
            }
            else
            {
                errProv.SetError(cmbMateria, String.Empty);
                checkMateria = true;
            }

            if (!Validador.es_numero(txtDNI))
            {
                errProv.SetError(txtDNI, "Sólo Números");
            }
            else
            {
                errProv.SetError(txtDNI, String.Empty);
                checkDNI = true;
            }

            return (checkDNI && checkCarrera && checkFecha && checkMateria);
        }

        private void dgvInscripciones_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.dgvInscripciones.CurrentCell != null)
            {
                d = Convert.ToInt32(this.dgvInscripciones.CurrentRow.Cells[0].Value.ToString());

                f = this.dgvInscripciones.CurrentRow.Cells[1].Value.ToString();

                m = this.dgvInscripciones.CurrentRow.Cells[2].Value.ToString();

                c = this.dgvInscripciones.CurrentRow.Cells[3].Value.ToString();

                this.txtDNI.Text = d.ToString();

                this.txtFecha.Text = f;

                this.cmbCarrera.Text = c;

                this.cmbMateria.Text = m;
            }
        }

        private void RefreshDgv()
        {
            DataTable inscripciones = createInsMateria.FindAllInscripcionesMaterias();

            if (null != inscripciones)
            {
                this.dgvInscripciones.Rows.Clear();

                foreach (DataRow dr in inscripciones.Rows)
                {
                    this.dgvInscripciones.Rows.Add(dr["alu_dni"],
                        Convert.ToDateTime(dr["inm_fecha"]).ToShortDateString(),
                        dr["mat_nombre"], dr["car_nombre"]);
                }
            }
        }

        private void cmbCarrera_SelectedIndexChanged(object sender, EventArgs e)
        {
            materias = createMateria.FindAllMaterias();

            if (null != materias)
            {
                this.cmbMateria.Items.Clear();

                DataRow[] drs = materias.Select("car_nombre = '" + this.cmbCarrera.Text + "'");

                foreach (DataRow dr in drs)
                {
                    this.cmbMateria.Items.Add(dr["mat_nombre"]);
                }
            }
        }

        private bool ValidarCorrelatividades()
        {
            bool validarCursadas = false;
            bool validarAprobadas = false;

            try
            {
                if (this.cmbCarrera.Text.Equals("Tecnicatura Superior en Programación"))
                {
                    Gestión_UTN.util.CorrelatividadTSP corr = Gestión_UTN.util.Correlatividades.GetCorrelatividadesTSPByMateria(this.cmbMateria.Text);

                    if (corr.Para_cursar_cursada.Contains('-'))
                    {
                        string[] cursadas = corr.Para_cursar_cursada.Split('-');

                        List<bo.Regularidadbo> regulares = createRegularidad.FindRegularidadByDni(Convert.ToInt32(this.txtDNI.Text));

                        int cont = 0;

                        foreach (var reg in regulares)
                        {
                            foreach (var cur in cursadas)
                            {
                                if (reg.Materia.Nombre.Equals(cur))
                                {
                                    cont += 1;
                                }
                            }
                        }

                        validarCursadas = (cont == cursadas.Length) ? true : false;

                        if (!validarCursadas)
                        {
                            View.util.Mensaje mensaje = new util.Mensaje();

                            mensaje.Titulo = "Atención";

                            mensaje.Message = "Debe Regularizar: " + corr.Para_cursar_cursada;

                            mensaje.ShowDialog();
                        }
                    }
                    else if (!corr.Para_cursar_cursada.Equals(""))
                    {
                        List<bo.Regularidadbo> regulares = createRegularidad.FindRegularidadByDni(Convert.ToInt32(this.txtDNI.Text));

                        foreach (var reg in regulares)
                        {
                            if (reg.Materia.Nombre.Equals(corr.Para_cursar_cursada))
                            {
                                validarCursadas = true;

                                break;
                            }
                        }

                        if (!validarCursadas)
                        {
                            View.util.Mensaje mensaje = new util.Mensaje();

                            mensaje.Titulo = "Atención";

                            mensaje.Message = "Debe Regularizar: " + corr.Para_cursar_cursada;

                            mensaje.ShowDialog();
                        }
                    }
                    else
                    {
                        validarCursadas = true;
                    }

                    if (corr.Para_cursar_aprobada.Contains('-'))
                    {
                        string[] rendidas = corr.Para_cursar_aprobada.Split('-');

                        List<bo.Aprobadabo> aprobadas = createAprobada.FindAprobadaByDni(Convert.ToInt32(this.txtDNI.Text));

                        int cont = 0;

                        foreach (var apr in aprobadas)
                        {
                            foreach (var ren in rendidas)
                            {
                                if (apr.Materia.Nombre.Equals(ren))
                                {
                                    cont += 1;
                                }
                            }
                        }

                        validarAprobadas = (cont == rendidas.Length) ? true : false;

                        if (!validarAprobadas)
                        {
                            View.util.Mensaje mensaje = new util.Mensaje();

                            mensaje.Titulo = "Atención";

                            mensaje.Message = "Debe Aprobar: " + corr.Para_cursar_aprobada;

                            mensaje.ShowDialog();
                        }
                    }
                    else if (!corr.Para_cursar_aprobada.Equals(""))
                    {
                        List<bo.Aprobadabo> aprobadas = createAprobada.FindAprobadaByDni(Convert.ToInt32(this.txtDNI.Text));

                        foreach (var apr in aprobadas)
                        {
                            if (apr.Materia.Nombre.Equals(corr.Para_cursar_aprobada))
                            {
                                validarAprobadas = true;

                                break;
                            }
                        }

                        if (!validarAprobadas)
                        {
                            View.util.Mensaje mensaje = new util.Mensaje();

                            mensaje.Titulo = "Atención";

                            mensaje.Message = "Debe Aprobar: " + corr.Para_cursar_aprobada;

                            mensaje.ShowDialog();
                        }
                    }
                    else
                    {
                        validarAprobadas = true;
                    }

                }
                else
                {
                    Gestión_UTN.util.CorrelatividadTSMI corr = Gestión_UTN.util.Correlatividades.GetCorrelatividadesTSMIByMateria(this.cmbMateria.Text);

                    if (corr.Correlatividad.Contains('-'))
                    {
                        string[] cursadas = corr.Correlatividad.Split('-');

                        List<bo.Regularidadbo> regulares = createRegularidad.FindRegularidadByDni(Convert.ToInt32(this.txtDNI.Text));

                        int cont = 0;

                        foreach (var reg in regulares)
                        {
                            foreach (var cur in cursadas)
                            {
                                if (reg.Materia.Nombre.Equals(cur))
                                {
                                    cont += 1;
                                }
                            }
                        }

                        validarAprobadas = validarCursadas = (cont == cursadas.Length) ? true : false;

                        if (!validarCursadas)
                        {
                            View.util.Mensaje mensaje = new util.Mensaje();

                            mensaje.Titulo = "Atención";

                            mensaje.Message = "Debe Regularizar y/o Aprobar: " + corr.Correlatividad;

                            mensaje.ShowDialog();
                        }
                    }
                    else if (!corr.Correlatividad.Equals(""))
                    {
                        List<bo.Regularidadbo> regulares = createRegularidad.FindRegularidadByDni(Convert.ToInt32(this.txtDNI.Text));

                        foreach (var reg in regulares)
                        {
                            if (reg.Materia.Nombre.Equals(corr.Correlatividad))
                            {
                                validarCursadas = true;
                                validarAprobadas = true;

                                break;
                            }
                        }

                        if (!validarCursadas)
                        {
                            View.util.Mensaje mensaje = new util.Mensaje();

                            mensaje.Titulo = "Atención";

                            mensaje.Message = "Debe Regularizar y/o Aprobar: " + corr.Correlatividad;

                            mensaje.ShowDialog();
                        }
                    }
                    else
                    {
                        validarCursadas = true;
                        validarAprobadas = true;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Validar Correlatividades!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                validarCursadas = false;
                validarAprobadas = false;

                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }

            return (validarAprobadas && validarCursadas);
        }
    }
}
